/**
 * DAO de la persitencia pel model metadada
 * @author Emili A. Moreno
 */

package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.model.MetaDC;
import edu.uoc.tfc.exuoc.model.MetadadaDetall;
import edu.uoc.tfc.exuoc.model.Item;

import edu.uoc.tfc.exuoc.errors.BuitException;
import edu.uoc.tfc.exuoc.errors.LlistatDAOException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.HibernateException;
import java.util.Iterator;
import edu.uoc.tfc.exuoc.utils.Eines;



public class MDCDAO {

    private GestorBDD gd=new GestorBDD();
    private GestorLogs  log=GestorLogs .getLogger(this.getClass().getName());

    protected MDCDAO(){
    }
    protected  void tancarConnexio() throws HibernateException{
        gd.close();
        gd=null;
    }
    protected MetaDC consulta(Long id) throws HibernateException, BuitException {
        MetaDC mdc=null;
        try{
            mdc=(MetaDC)gd.llegir(MetaDC.class, id);
        }catch(HibernateException e){
            log.error("MDCDAO:Consulta:No s'ha pogut obtenir la MDC amb id:  "
                    +String.valueOf(id));
            //throw e;

        }catch (BuitException e){
            log.error("MDCDAO:Consulta:No s'ha pogut obtenir la MDC amb id"
                    +String.valueOf(id));
            throw e;
        }
        return mdc;
    }

    public MetaDC consulta(Class classe ,Long id)
            throws HibernateException, BuitException {
        MetaDC mdc=null;
        try{
            //08/12/2011:Emili:gd.begin();
            mdc=(MetaDC)gd.llegir(classe, id);

        }catch(HibernateException e){
            log.error("MDCDAO:consulta:No s'ha pogut obtenir la metadada:"
                    +String.valueOf(id));
            //throw e;
        }catch (BuitException e){
            log.error("MDCDAO:consulta:metadada buida anb id: "
                    +String.valueOf(id));
            throw e;
        }
        return mdc;
    }

    public Iterator<MetaDC> llista()  throws LlistatDAOException, BuitException{
        Iterator<MetaDC> llistat =null;
        try{
            llistat= (Iterator<MetaDC>) gd.Llista(MetaDC.class).iterator();
        }catch (HibernateException e){
            log.error("MDCDAO:llista:No s'ha pogut obtenir el llistat " +
                    "de MetaDC");
            throw new LlistatDAOException("MDCDAO:llista:No s'ha pogut obtenir "
                    +"el llistat de MetaDC."+e.getLocalizedMessage());
        }catch (NullPointerException e){
            log.error("MDCDAO:llista:llistat null");
            throw new BuitException("MDCDAO:llista:Llistat null "
                    +e.getLocalizedMessage());
        }

        finally{
           // gd.close();
        }
        return llistat;
    }



     public static void main(String args[]) {
        MDCDAO mDao = new MDCDAO();
        try {

            Iterator<MetaDC> iter;
            iter=mDao.llista();
            while (iter.hasNext()){
                MetaDC dc=iter.next();
                Eines.escriu(dc);
            }
            MetaDC mdc = mDao.consulta(1L);
            Eines.escriu("MDC: "+mdc);
            //list<Item> ll= new ArrayList<Item>();
            //16-01-2012:Emili:M-N:Iterator<Item> it=mdc.getItems().iterator();
            Iterator<MetadadaDetall> it=mdc.getMetadadesDetalls().iterator();
            while (it.hasNext()){
                Item i=it.next().getItem();
                Eines.escriu("   -Item: "+i.toString());
            }
        } catch (HibernateException ex) {
            Logger.getLogger(MDCDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BuitException ex) {
            Logger.getLogger(MDCDAO.class.getName()).log(Level.SEVERE, null, ex);
        }catch (LlistatDAOException ex) {
            Logger.getLogger(MDCDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        mDao.tancarConnexio();

    }
}
